Function module ZSTB_RFC_READ_QUERY

Import
FIELD_SEPARATOR     TYPE    ADD_SERVICE ','
STRING_DELIMITER    TYPE    ADD_SERVICE '"'

Tables
FIELDS      LIKE    ZSTB_SQL_CLAUSE_ELEMENTS
FROMCLAUSE  LIKE    ZSTB_SQL_CLAUSE_ELEMENTS
WHERECLAUSE LIKE    ZSTB_SQL_CLAUSE_ELEMENTS
DATA        LIKE    ZSTB_SQL_ROWS

Source code
FUNCTION ZSTB_RFC_READ_QUERY .
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(FIELD_SEPARATOR) TYPE  ADD_SERVICE DEFAULT ','
*"     VALUE(STRING_DELIMITER) TYPE  ADD_SERVICE DEFAULT '"'
*"  TABLES
*"      FIELDS STRUCTURE  ZSTB_SQL_CLAUSE_ELEMENTS
*"      FROMCLAUSE STRUCTURE  ZSTB_SQL_CLAUSE_ELEMENTS
*"      WHERECLAUSE STRUCTURE  ZSTB_SQL_CLAUSE_ELEMENTS
*"      DATA STRUCTURE  ZSTB_SQL_ROWS
*"----------------------------------------------------------------------
 TYPE-POOLS: abap.
  DATA:
    columnname        TYPE so_text,
    fielddatadescrref TYPE REF TO abap_componentdescr,
    numberfields      TYPE i,
    fielddescr        TYPE abap_componentdescr,
    fieldname         TYPE string,
    fielddescrtab     TYPE abap_component_tab,
    rowstructdescr    TYPE REF TO cl_abap_structdescr,
    rowreference      TYPE REF TO data,
    returnrowstring   TYPE string,
    datafieldstring   TYPE string,
    dataline          LIKE data,
    fromclauserow     TYPE ZSTB_SQL_CLAUSE_ELEMENTS,
    fromclausestring  TYPE string,
    whereclauserow    TYPE ZSTB_SQL_CLAUSE_ELEMENTS,
    whereclausestring TYPE string,
    fieldsrow         TYPE ZSTB_SQL_CLAUSE_ELEMENTS.
  FIELD-SYMBOLS:
    <datarow>   TYPE any,
    <datafield> TYPE any.


* CREATE DataStructure with field names
* Datatypes are read from fieldnames of FIELDS input table
  DESCRIBE TABLE fields LINES numberfields.
  LOOP AT fields INTO fieldsrow.
    fieldname = sy-tabix.
* names need to be unique and must start with a char
    CONCATENATE 'string' fieldname INTO fieldname.
    CONDENSE fieldname.
    fielddescr-name = fieldname.
* for dictionary lookup we need to change columnnames from Open SQL
* to dictionary notation
    columnname = fieldsrow-text.
    REPLACE FIRST OCCURRENCE OF SUBSTRING '~' IN columnname WITH '-' RESPECTING CASE.

    fielddescr-type ?= cl_abap_typedescr=>describe_by_name( columnname ).
    APPEND fielddescr TO fielddescrtab.
  ENDLOOP.

  rowstructdescr = cl_abap_structdescr=>create( fielddescrtab ).

* now we create the actual data structure in memory
  CREATE DATA rowreference TYPE HANDLE rowstructdescr.
* finally we assign it to the Field-symbol used by the select statement
  ASSIGN rowreference->* TO <datarow>.
* End Create DataStructure

* to simplify calls we concatenate from and whereclause into strings
* this way caller doesn't need to check word wrappings
  fromclausestring = ''.
  LOOP AT fromclause INTO fromclauserow.
    CONCATENATE fromclausestring fromclauserow-text
    INTO fromclausestring SEPARATED BY SPACE.
  ENDLOOP.

  whereclausestring = ''.
  LOOP AT whereclause INTO whereclauserow.
    CONCATENATE whereclausestring whereclauserow-text
    INTO whereclausestring SEPARATED BY SPACE.
  ENDLOOP.

* Now start actual select operation
  SELECT (fields) FROM (fromclausestring) INTO <datarow> WHERE (whereclausestring).
* we read all fields of the current row, cast it to string and
* concatenate it into a dataline with division chars.
    CLEAR: returnrowstring.
    DO numberfields TIMES.
      ASSIGN COMPONENT sy-index OF STRUCTURE <datarow> TO <datafield>.
      datafieldstring = <datafield>.
      CONCATENATE returnrowstring '|' datafieldstring INTO returnrowstring.
    ENDDO.
    dataline = returnrowstring.
* finally dataline is added to the return table.
    INSERT dataline INTO TABLE data.
  ENDSELECT.
ENDFUNCTION.